package com.princess.baselib.utils

import com.princess.baselib.utils.Base64DES.encode
import com.princess.baselib.utils.Base64DES.decode
import android.annotation.SuppressLint
import com.princess.baselib.utils.DES
import com.princess.baselib.utils.Base64DES
import java.io.UnsupportedEncodingException
import java.security.InvalidAlgorithmParameterException
import java.security.InvalidKeyException
import java.security.NoSuchAlgorithmException
import javax.crypto.BadPaddingException
import javax.crypto.Cipher
import javax.crypto.IllegalBlockSizeException
import javax.crypto.NoSuchPaddingException
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec

object DES {
    const val CHAR_SET = "utf-8"
    private val iv = byteArrayOf(15, 24, 39, 41, 55, 68, 53, 94)

    //密钥
    private val skey = "ForUApp=".toByteArray()
    val keyValue: ByteArray?
        external get

    external fun getIv(): ByteArray?

    //    static {
    //        System.loadLibrary("security");
    //        skey = getKeyValue();
    //        iv = getIv();
    //    }
    @SuppressLint("TrulyRandom")
            /**
             * 加密
             * @param encryptString 待加密字�?
             * @return 加密后字符串
             */
    fun encryptDES(encryptString: String): String {
        val zeroIv = IvParameterSpec(iv)
        val key = SecretKeySpec(skey, "DES")
        try {
            val cipher = Cipher.getInstance("DES/CBC/PKCS5Padding")
            cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv)
            val encryptedData = cipher.doFinal(encryptString.toByteArray())
            return encode(encryptedData)
        } catch (e: NoSuchAlgorithmException) {
            e.printStackTrace()
        } catch (e: NoSuchPaddingException) {
            e.printStackTrace()
        } catch (e: IllegalBlockSizeException) {
            e.printStackTrace()
        } catch (e: BadPaddingException) {
            e.printStackTrace()
        } catch (e: InvalidKeyException) {
            e.printStackTrace()
        } catch (e: InvalidAlgorithmParameterException) {
            e.printStackTrace()
        }
        return encryptString
    }

    /**
     * DES解密
     *
     * @param decryptString 待解密字符
     * @return 解密后字符串
     */
    fun decryptDES(decryptString: String): String {
        val byteMi = decode(decryptString)
        val zeroIv = IvParameterSpec(iv)
        val key = SecretKeySpec(skey, "DES")
        try {
            val cipher = Cipher.getInstance("DES/CBC/PKCS5Padding")
            cipher.init(Cipher.DECRYPT_MODE, key, zeroIv)
            val decryptedData = cipher.doFinal(byteMi)
            return String(decryptedData, CHAR_SET)
        } catch (e: NoSuchAlgorithmException) {
            e.printStackTrace()
        } catch (e: NoSuchPaddingException) {
            e.printStackTrace()
        } catch (e: InvalidKeyException) {
            e.printStackTrace()
        } catch (e: InvalidAlgorithmParameterException) {
            e.printStackTrace()
        } catch (e: UnsupportedEncodingException) {
            e.printStackTrace()
        } catch (e: IllegalBlockSizeException) {
            e.printStackTrace()
        } catch (e: BadPaddingException) {
            e.printStackTrace()
        }
        return decryptString
    }

    @SuppressLint("DefaultLocale")
    fun parseByte2HexStr(buf: ByteArray): String {
        val sb = StringBuffer()
        for (i in buf.indices) {
            var hex = Integer.toHexString(buf[i] and 0xFF)
            if (hex.length == 1) {
                hex = "0$hex"
            }
            sb.append(hex.toUpperCase())
        }
        return sb.toString()
    }
}